package br.com.sgi.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import br.com.sgi.model.Igreja;
import br.com.sgi.model.Membro;
import br.com.sgi.model.Visitante;
import br.com.sgi.service.IgrejaService;
import br.com.sgi.service.MembroService;
import br.com.sgi.service.VisitanteService;
import br.com.sgi.util.Mensagem;

/**
 * 
 * @author lucas
 * 
 */
@Controller("visitanteCadastro")
@Scope("request")
public class VisitanteCadastroBean extends BaseView {

	@Autowired
	private IgrejaService igrejaService;

	@Autowired
	private VisitanteService visitanteService;

	@Autowired
	private MembroService membroService;

	private Visitante visitante;
	private Visitante visitantePesquisa;

	private List<Visitante> listaVisitante;

	private List<Igreja> listaIgreja;

	private String membro;

	private Long coVisitante;

	private String coMembro;

	private String status;

	public List<SelectItem> autocomplete(Object suggest) {
		String pref = (String) suggest;
		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Membro> membros = membroService.buscarTodosMembrosPorUsers();
		for (Membro membro : membros) {
			if ((membro.getNome() != null && membro.getNome().toLowerCase().indexOf(
					pref.toLowerCase()) == 0)
					|| "".equals(pref)) {
				result.add(new SelectItem(membro.getCoSeqMembro(), membro.getNome()));
			}
		}
		return result;
	}
	
	public boolean validaAutocomplete(){
		boolean valido =  true;
		if(coMembro != null && !coMembro.isEmpty()){
			Membro mb = membroService.buscarMembroPorId(Long.valueOf(coMembro));
			if(!mb.getNome().equals(membro)){
				membro = "";
				coMembro = "";
				Mensagem.addWarn("erro.MSG_24");
				valido = false;
			}
		}else{
			if(membro != null && !membro.isEmpty()){
				valido = false;
				Mensagem.addWarn("erro.MSG_24");
				membro = "";
			}
		}
			
			
			
		return valido;
	}

	public void editar() {
		if (visitante.getMembroResponsavel() != null) {
			Membro membroResp = membroService.buscarMembroPorId(visitante.getMembroResponsavel()
					.getCoSeqMembro());
			membro = membroResp.getNome();
			coMembro = membroResp.getCoSeqMembro().toString();
		}
		statusEditar();

	}

	public void excluir() {

		try {
			visitanteService.excluir(visitante.getCoSeqVisitante());
			// listaVisitante = visitanteService.buscarVisitantesPorUser();
			pesquisar();
			limparCampos();
			statusBotoesPesquisa();
			Mensagem.infoMsg("sucesso.MSG_01");
		} catch (DataIntegrityViolationException e) {
			Mensagem.addWarn("erro.MSG_05");
		} catch (Exception e) {
			Mensagem.addWarn("erro.MSG_15");
		}

	}

	public String getCoMembro() {
		return coMembro;
	}

	public Long getCoVisitante() {
		return coVisitante;
	}

	public List<Igreja> getListaIgreja() {
		if (listaIgreja == null) {
			listaIgreja = igrejaService.buscarIgrejasPorUsers();
		}
		return listaIgreja;
	}

	public List<Visitante> getListaVisitante() {
		if (listaVisitante == null) {
			listaVisitante = new ArrayList<Visitante>();
		}
		return listaVisitante;
	}

	public String getMembro() {
		return membro;
	}

	public String getStatus() {
		return status;
	}

	public Visitante getVisitante() {
		if (visitante == null) {
			visitante = new Visitante();
		}
		return visitante;
	}

	public Visitante getVisitantePesquisa() {
		if (visitantePesquisa == null) {
			visitantePesquisa = new Visitante();
		}
		return visitantePesquisa;
	}

	private void limparCampos() {
		visitante = new Visitante();
		membro = "";
	}

	/**
	 * Inicia tela para um novo cadastro
	 * 
	 * @return
	 */
	public void novo() {
		statusBotoesCadastro();
		visitante = new Visitante();
	}

	public void pesquisar() {
		Long coIgreja = visitantePesquisa.getIgrejaPertence() != null ? visitantePesquisa
				.getIgrejaPertence().getCoSeqIgreja() : null;
		listaVisitante = visitanteService.buscarVisitantesPorFiltro(visitantePesquisa.getNome(),
				visitantePesquisa.getDtNascimento(), visitantePesquisa.getDtCadastroVisitante(),
				coIgreja, status);
		if (listaVisitante.isEmpty()) {
			super.registroNaoEncontrado = true;
		}
	}

	/**
	 * salva visitante
	 */
	public void salvar() {
		
		if(validaAutocomplete()){
			if (visitante.getCoSeqVisitante() == null) {
				if (membro != null && !membro.isEmpty() && coMembro != null && !coMembro.isEmpty()) {
					visitante.setMembroResponsavel(membroService.buscarMembroPorId(Long
							.valueOf(coMembro)));
				}
	
				visitante.setInativo(false);
				visitante.seteMembro("N");
				visitanteService.salvar(visitante);
				listaVisitante = visitanteService.buscarVisitantesPorFiltro(null, null, null, null, "");
				limparCampos();
				Mensagem.infoMsg("sucesso.MGS_02");
				super.statusBotoesPesquisa();
			} else {
				if (membro != null && !membro.isEmpty() && coMembro != null && !coMembro.isEmpty()) {
					visitante.setMembroResponsavel(membroService.buscarMembroPorId(Long
							.valueOf(coMembro)));
				}
				visitanteService.atualizar(visitante);
				listaVisitante = visitanteService.buscarVisitantesPorFiltro(null, null, null, null, "");
				limparCampos();
				Mensagem.infoMsg("sucesso.MGS_03");
				super.statusBotoesPesquisa();
			}
		}

	}

	public void setCoMembro(String coMembro) {
		this.coMembro = coMembro;
	}

	public void setCoVisitante(Long coVisitante) {
		this.coVisitante = coVisitante;
	}

	public void setListaIgreja(List<Igreja> listaIgreja) {
		this.listaIgreja = listaIgreja;
	}

	public void setListaVisitante(List<Visitante> listaVisitante) {
		this.listaVisitante = listaVisitante;
	}

	public void setMembro(String membro) {
		this.membro = membro;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public void setVisitante(Visitante visitante) {
		this.visitante = visitante;
	}

	public void setVisitantePesquisa(Visitante visitantePesquisa) {
		this.visitantePesquisa = visitantePesquisa;
	}

	/**
	 * voltar a tela de pesquisa
	 */
	public void voltar() {
		statusBotoesPesquisa();
	}

}
